package util;


import java.math.BigInteger;

/**
 * 多项式
 * 没有降序或者时升序排列检查和排列功能
 */
//TODO-pht:将这个类当中的系数改变为使用element类型的元素
public class Polynomial {
    //多项式的项数
    private int size;
    //多项式的每一项
    private PolyItem[] items;

    /**
     * 通过直接提供多项式每一项构成的数组来初始化多项式
     * @param items 多项式项构成的数组
     */
    public Polynomial(PolyItem[] items){
        this.items=items;
        this.size=items.length;
    }

    /**
     * 通过提供多项式的项数来初始化，在后续自己设置每一项
     * @param size 多项式的项数
     */
    public Polynomial(int size){
        this.size=size;
        items=new PolyItem[size];
    }

    /**
     * 设置多项式的每一项
     * @param item 多项式的项
     * @param tag 放在多项式数组中的什么位置，需要自己按照升序或者是降序进行排列
     * @throws Exception 数组越界
     */
    public void setItems(PolyItem item,int tag) throws Exception {
        if(tag>=size){
            throw new Exception("数组越界/beyond array bound");
        }
        items[tag]=item;
    }

    /**
     * 通过提供多项式项的阶和系数来初始化多项式
     * @param order 多项式某一项的阶
     * @param coefficient 多项式某一项的系数
     * @param tag 放在多项式数组的哪一个位置
     * @throws Exception 数组越界
     */
    public void setItems(int order,BigInteger coefficient,int tag) throws Exception {
        if(tag>=size){
            throw new Exception("数组越界/beyond array bound");
        }
        PolyItem item=new PolyItem(coefficient,order);
        items[tag]=item;
    }

    /**
     * 计算多项式的值
     * @param x 自变量的值
     * @return 多项式的值
     */
    public BigInteger calValue(BigInteger x){
        BigInteger tempResult;
        BigInteger result=BigInteger.ZERO;
        for (int i = 0; i < size; i++) {
            tempResult=x.pow(items[i].getOrder());
            tempResult=tempResult.multiply(items[i].getCoefficient());
            result=result.add(tempResult);
        }
        return result;
    }


    /**
     * 通过提供的标识来获取多项式的某一项
     * @param tag 标识
     * @return 多项式的项
     * @throws Exception 数组越界
     */
    public PolyItem getItem(int tag) throws Exception {
        if(tag>=size){
            throw new Exception("数组越界/beyond array bound");
        }
        return items[tag];
    }

    //TODO-pht:添加将多项式降序排列的函数



}
